<html><head><meta charset="utf-8"/><title>对象</title></head><body><h1>对象</h1><div class="x-wiki-content x-main-content">
 <p>
  JavaScript的对象是一种无序的集合数据类型，它由若干键值对组成。
 </p>
 <p>
  JavaScript的对象用于描述现实世界中的某个对象。例如，为了描述“小明”这个淘气的小朋友，我们可以用若干键值对来描述他：
 </p>
 <pre><code>var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
</code></pre>
 <p>
  JavaScript用一个
  <code>
   {...}
  </code>
  表示一个对象，键值对以
  <code>
   xxx: xxx
  </code>
  形式申明，用
  <code>
   ,
  </code>
  隔开。注意，最后一个键值对不需要在末尾加
  <code>
   ,
  </code>
  ，如果加了，有的浏览器（如低版本的IE）将报错。
 </p>
 <p>
  上述对象申明了一个
  <code>
   name
  </code>
  属性，值是
  <code>
   '小明'
  </code>
  ，
  <code>
   birth
  </code>
  属性，值是
  <code>
   1990
  </code>
  ，以及其他一些属性。最后，把这个对象赋值给变量
  <code>
   xiaoming
  </code>
  后，就可以通过变量
  <code>
   xiaoming
  </code>
  来获取小明的属性了：
 </p>
 <pre><code>xiaoming.name; // '小明'
xiaoming.birth; // 1990
</code></pre>
 <p>
  访问属性是通过
  <code>
   .
  </code>
  操作符完成的，但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符，就必须用
  <code>
   ''
  </code>
  括起来：
 </p>
 <pre><code>var xiaohong = {
    name: '小红',
    'middle-school': 'No.1 Middle School'
};
</code></pre>
 <p>
  <code>
   xiaohong
  </code>
  的属性名
  <code>
   middle-school
  </code>
  不是一个有效的变量，就需要用
  <code>
   ''
  </code>
  括起来。访问这个属性也无法使用
  <code>
   .
  </code>
  操作符，必须用
  <code>
   ['xxx']
  </code>
  来访问：
 </p>
 <pre><code>xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'
</code></pre>
 <p>
  也可以用
  <code>
   xiaohong['name']
  </code>
  来访问
  <code>
   xiaohong
  </code>
  的
  <code>
   name
  </code>
  属性，不过
  <code>
   xiaohong.name
  </code>
  的写法更简洁。我们在编写JavaScript代码的时候，属性名尽量使用标准的变量名，这样就可以直接通过
  <code>
   object.prop
  </code>
  的形式访问一个属性了。
 </p>
 <p>
  实际上JavaScript对象的所有属性都是字符串，不过属性对应的值可以是任意数据类型。
 </p>
 <p>
  如果访问一个不存在的属性会返回什么呢？JavaScript规定，访问不存在的属性不报错，而是返回
  <code>
   undefined
  </code>
  ：
 </p>
 <pre><code class="language-x-javascript">'use strict';

var xiaoming = {
    name: '小明'
};
----
console.log(xiaoming.name);
console.log(xiaoming.age); // undefined
</code></pre>
 <p>
  由于JavaScript的对象是动态类型，你可以自由地给一个对象添加或删除属性：
 </p>
 <pre><code>var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错
</code></pre>
 <p>
  如果我们要检测
  <code>
   xiaoming
  </code>
  是否拥有某一属性，可以用
  <code>
   in
  </code>
  操作符：
 </p>
 <pre><code>var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
'name' in xiaoming; // true
'grade' in xiaoming; // false
</code></pre>
 <p>
  不过要小心，如果
  <code>
   in
  </code>
  判断一个属性存在，这个属性不一定是
  <code>
   xiaoming
  </code>
  的，它可能是
  <code>
   xiaoming
  </code>
  继承得到的：
 </p>
 <pre><code>'toString' in xiaoming; // true
</code></pre>
 <p>
  因为
  <code>
   toString
  </code>
  定义在
  <code>
   object
  </code>
  对象中，而所有对象最终都会在原型链上指向
  <code>
   object
  </code>
  ，所以
  <code>
   xiaoming
  </code>
  也拥有
  <code>
   toString
  </code>
  属性。
 </p>
 <p>
  要判断一个属性是否是
  <code>
   xiaoming
  </code>
  自身拥有的，而不是继承得到的，可以用
  <code>
   hasOwnProperty()
  </code>
  方法：
 </p>
 <pre><code>var xiaoming = {
    name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
</code></pre>
</div>
</body></html>